/*
 ============================================================================
 Name        : tpg1.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>


#include "test_documentos.h"
#include "test_indice.h"


#define COMMAND_ALTA "a"
#define COMMAND_BAJA "b"
#define COMMAND_CONSULTA "c"

#include "TDAIndiceInvertido.h"
#include "TDADocumentos.h"



/*

-------------------------
Consultas Rankeadas
-------------------------

Introducci�n
�ndice invertido: �ndice de clasificaci�n de documentos por t�rmino. En la versi�n b�sica, por
cada t�rmino, se tiene la lista de documentos en los que aparece el t�rmino. El conjunto de
t�rminos es el vocabulario o l�xico. Las listas de cada t�rmino son listas invertidas.
Listas Invertidas: una por cada t�rmino, contiene una lista ordenada de forma ascendente de los
n�meros de documentos donde se encuentra ese t�rmino


-----------------------------
Objetivo
-----------------------------

Dado un grupo de documentos, se pretende indexar las palabras que los contienen dentro del
indice para saber en que documentos se encuentran y luego poder recuperar los documentos
m�s frecuentemente consultados.



-----------------------------
Archivos de salida esperados
-----------------------------

La ejecuci�n del TP, con los argumentos adecuados, debe dar como salida por pantalla el
resultado de la consulta.


-----------------------------
Ejecuci�n
-----------------------------

Alta en el �ndice
tp1g a l�xico idDocumento t�tulo


Baja en el �ndice
tp1g b l�xico idDocumento

Consultar
tp1g c l�xico

Deber� devolver un informe por pantalla con los n documentos resultantes seg�n el atributo
longitudConsulta del TDAIndiceInvertido. Con su id Documento, T�tulo y cantidad de consultas
a este documento (ordenada por la m�trica para rankear descendentemente). Adem�s deber�
informar la cantidad de veces que se consult� por este l�xico.


*/

void pausa()
{
	char str[50];
	gets(str);
}

void test_strstk()
{

   const char str[80] = "1,Prueba.txt,0,[Hola,Mundo,C]";
   const char s[3] = "[]";
   char *token;

   /* get the first token */
   token = strtok(str, s);

   /* walk through other tokens */
   while( token != NULL )
   {
	  printf( " %s\n", token );

	  token = strtok(NULL, s);
   }


}

typedef enum eParameters
{
	eCommand = 1,
	eLexico = 2,
	eIdDocumento = 3,
	eTitulo = 4
};

int main(int argc,char **argv) {

	//test_strstk();

	//test_tda_documentos_creacion_y_impresion();//--------------------------------OK
	//test_tda_documentos_guardar_en_disco();//------------------------------------OK
	//test_tda_documentos_leer_de_disco_y_imprimir();//----------------------------OK
	//test_tda_documentos_borrar_documento_en_disco();//---------------------------OK
	//test_tda_documentos_modificar_documento_en_disco();------------------------OK
	//test_tda_documentos_leer_de_disco_modificar_e_imprimir_en_pantalla();//--------OK
	//test_tda_documentos_consultar_y_modificar_documento_en_disco();//------------OK
	//test_tda_documentos_solamente_leer_y_guardar_en_disco();
	//test_tda_documentos_creacion_y_impresion_b();//--------------OK
	//test_tda_documentos_alta_desde_disco();//--------------OK

	//test_tda_documentos_consultar_y_modificar_documento_en_disco_agregar_lexicos();//-------OK
	//test_tda_documentos_consultar_y_modificar_documento_en_disco_eliminar_lexicos();//--------OK
	//test_tda_lexicos();

	//test_tda_indice_leer_de_disco_y_imprimir();
	test_tda_indice_solamente_leer_y_guardar_en_disco();


	FILE * pArchivoIndiceCsv;
	FILE * pArchivoDocumentosCsv;
	FILE * pArchivoLexicosCsv;
	TDAIndiceInvertido * i;
	int longitudConsulta = 10;



	TDAIndiceInvertido *tdaIndice = malloc(sizeof(TDAIndiceInvertido));


	files_open_read_mode(pArchivoIndiceCsv,		INDICE_FILE);
	files_open_read_mode(pArchivoDocumentosCsv,	DOCUMENTOS_FILE);
	files_open_read_mode(pArchivoLexicosCsv,	LEXICOS_FILE);

	iCrear(pArchivoIndiceCsv,pArchivoDocumentosCsv,pArchivoLexicosCsv,tdaIndice,longitudConsulta);

	files_close_read_mode(pArchivoIndiceCsv);
	files_close_read_mode(pArchivoDocumentosCsv);
	files_close_read_mode(pArchivoLexicosCsv);



	//Alta en el �ndice
	//tp1g a l�xico idDocumento t�tulo
	if (strcmp(argv[eCommand],COMMAND_ALTA)==0)
	{
		int idDocumento = atoi(argv[eIdDocumento]);
		iAgregar(tdaIndice,argv[eLexico],idDocumento);
	}
	//Baja en el �ndice
	//tp1g b l�xico idDocumento
	else if (strcmp(argv[eCommand],COMMAND_BAJA)==0)
	{
		int idDocumento = atoi(argv[eIdDocumento]);
		iEliminar(tdaIndice,argv[eLexico],idDocumento);

	}
	//Consultar
	//tp1g c l�xico
	else if (strcmp(argv[eCommand],COMMAND_CONSULTA)==0)
	{
		TListaSimpleOrdenada *listaDocumentos;
		listaDocumentos = malloc(sizeof(TListaSimpleOrdenada));
		LSO_Crear(listaDocumentos,
					sizeof(ITEM_TDA_DOCUMENTOS),
					fCreateDocumento,
					fCmpDocumento,
					fCopyDocumento,
					fDestroyDocumento,
					fOrderDocumento);



		iConsultaRankeada(tdaIndice,argv[eLexico],listaDocumentos );

		tda_docuemntos_print_listaDocumentos(listaDocumentos);

		LSO_Vaciar(listaDocumentos);

		free(listaDocumentos);
	}

	files_open_write_mode(pArchivoIndiceCsv,		INDICE_FILE,		INDICE_TMP_FILE);
	files_open_write_mode(pArchivoDocumentosCsv,	DOCUMENTOS_FILE,	DOCUMENTOS_TMP_FILE);
	files_open_write_mode(pArchivoLexicosCsv,		LEXICOS_FILE,		LEXICOS_TMP_FILE);

	iDestruir(pArchivoIndiceCsv,pArchivoDocumentosCsv,pArchivoLexicosCsv,tdaIndice,longitudConsulta);
	free(tdaIndice);

	files_close_write_mode(pArchivoIndiceCsv);
	files_close_write_mode(pArchivoDocumentosCsv);
	files_close_write_mode(pArchivoLexicosCsv);


	return EXIT_SUCCESS;
}
